package org.devside.grails.queue;

/**
 * 消息队列
 * @param <T> 队列里放的类型
 */
public interface IMessageQueue<T> {

    /**
     * 开始
     */
    void init();

    /**
     * 是否正在运行
     *
     * @return true: 正在运行
     */
    boolean isRunning();

    /**
     * 向队列中添加消息, 如果列队已经关闭了,则加入的消息会被忽略
     *
     * @param msg 消息
     */
    void addMessage(T msg);

    /**
     * 停止处理,列队不再接受消息, 但是会将已经在列队中的消息消费完
     */
    void closeAndFlush();

    /**
     * 停止处理,列队不再接受消息, 已经在列队中的消息会被丢弃
     */
    void close();

    /**
     * 挂起队列,不接受消息, 不处理消息
     */
    void hangup();

    /**
     * 恢复队列
     */
    void resume();

    /**
     * 像队列发送命令
     *
     * @param cmd 命令
     */
    void sendCommand(QueueCommand cmd);
}